#include<iostream>
#include<string>

using namespace std;

/*先来一个父类*/
class Animal
{
    public:
         virtual void run(){
            cout << "Animal 的run()方法"<<endl;
        }
};

/*来一个子类*/
class Dog : public Animal
{
    public:
        void run(){
            cout << "Dog 的run 方法"<<endl;
        }
};

/*再来一个子类*/
class Cat : public Animal
{
    public:
        void run(){
            cout << "Cat 的 run()方法"<<endl;
        }
};

int main()
{
    /*声明一个父类到指针，注：没有实例化*/
    Animal *animal;
    /*对dog实例化*/
    Dog dog;
    /*对cat实例化*/
    Cat cat;

    /*  存储dog对象到地址*/
    animal = &dog;
    /*  调用run()方法*/
    animal->run();

    animal = &cat;
    animal->run();
    return 0;
}

/*
运行结果：
    Dog 的run 方法
    Cat 的 run()方法 
*/

/*
    虚函数是 C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访
    问派生类定义的函数。简单的来说，上面的实例是基类 Animal 声明了一个指针 animal。然后通
    过基类的指针来访问 Dog 类对象与 Cat 类的对象的 run()方法，前提是基类的 run()方法必须声
    明为虚函数，如果不声明为虚函数，基类的指针将访问到基类自己的 run()方法。我们可以尝试
    把 virtual 关键字去掉再重新编译测试，如果不加关键字 virtual 会是什么情况。
    会出现这种结果：
    Animal 的run()方法
    Animal 的run()方法
*/

